SportsClient.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. "use client";
  2. import { FC, useEffect, useRef, useState } from "react";
  3. import { useRouter } from "@/i18n/routing"; // Assuming router logic
  4. import { GameInfo } from "@/api/home";
  5. import { server } from "@/utils/client";
  6. import { useTranslations } from "next-intl";
  7. import Script from "next/script";
  8. interface Props {
  9. brand_id: string;
  10. token: string;
  11. }
  12. const SportsClient: FC<Props> = (props) => {
  13. const { brand_id, token } = props;
  14. const [currentToken, setCurrentToken] = useState(token);
  15. const btRef = useRef(null);
  16. const router:any = useRouter();
  17. useEffect(() => {
  18. if (typeof window !== "undefined") {
  19. const script = document.createElement("script");
  20. script.src = "https://ui.invisiblesport.com/bt-renderer.min.js";
  21. script.async = true;
  22. script.onload = () => {
  23. onLoad();
  24. };
  25. document.body.appendChild(script);
  26. return () => {
  27. console.log("onLoad=====> Clean up");
  28. if (btRef.current) {
  29. // @ts-ignore
  30. btRef.current?.kill();
  31. btRef.current = null;
  32. }
  33. document.body.removeChild(script); // Remove script when component unmounts
  34. };
  35. }
  36. }, []);
  37. useEffect(() => {
  38. // 如果token更新了才调用update
  39. if( currentToken !== token){
  40. updateToken(token);
  41. }
  42. }, [token]);
  43. const updateToken = (newToken: string) => {
  44. // @ts-ignore
  45. if(currentToken!== newToken){
  46. setCurrentToken(newToken);
  47. // 多次点击当前页面只需要跳转到首页即可
  48. // 使用 updateOptions 更新当前的 BTRenderer 参数,而不是重新初始化
  49. if (btRef.current) {
  50. // 更新 token 和其他配置
  51. // @ts-ignore
  52. btRef.current.updateOptions({
  53. token: newToken, // 更新 token
  54. url: '/', // 更新 URL 或其他参数
  55. betSlipOffsetBottom: 80,
  56. betSlipZIndex: 1000,
  57. stickyTop: 0,
  58. betSlipOffsetTop: 50,
  59. });
  60. }
  61. }
  62. }
  63. const getGameDetailApi = async () => {
  64. const data = await server
  65. .request<GameInfo>({
  66. url: "/v1/api/front/game_info_by_id",
  67. method: "post",
  68. data: { id: "sportsBet", mode: 1 },
  69. })
  70. .then((res) => {
  71. if (res.code === 200) {
  72. setCurrentToken(res.data.game_url)
  73. return res.data.game_url;
  74. } else {
  75. return "";
  76. }
  77. });
  78. return data;
  79. };
  80. const onLoad = () => {
  81. // @ts-ignore
  82. const bt = new BTRenderer();
  83. btRef.current = bt;
  84. // @ts-ignore
  85. bt.initialize({
  86. brand_id: brand_id,
  87. token: token,//使用最新的token
  88. onTokenExpired: getGameDetailApi, //过期自动更新token
  89. onSessionRefresh: () => {
  90. window.location.reload();
  91. },
  92. themeName: "default",
  93. lang: "pt-br",
  94. target: document.getElementById("betby"),
  95. betSlipOffsetBottom: 80,
  96. // betSlipOffsetRight: 750,
  97. betSlipZIndex: 1000,
  98. stickyTop: 0,
  99. betSlipOffsetTop: 50,
  100. onRecharge: function () {
  101. router.push("/deposit");
  102. },
  103. onRouteChange: function () {
  104. },
  105. onLogin: function () {},
  106. onRegister: function () {},
  107. onBetSlipStateChange: function () {},
  108. });
  109. };
  110. return <div id="betby" className="h-[100%]"></div>;
  111. };
  112. export default SportsClient;